// src/utils/responseInterceptor.js
import { aesDecrypt } from "./aesDecrypt";

/**
 * 安装响应拦截器，自动解密接口返回的Data字段
 */
export function installResponseInterceptor(Vue) {
  // 保存原始的$get, $post, $put方法
  const originalGet = Vue.prototype.$get;
  const originalPost = Vue.prototype.$post;
  const originalPut = Vue.prototype.$put;

  // 重写$get方法
  Vue.prototype.$get = function(url, params, options = {}) {
    return originalGet
      .call(this, url, params, options)
      .then((response) => handleResponse(response));
  };

  // 重写$post方法
  Vue.prototype.$post = function(url, data, options = {}) {
    return originalPost
      .call(this, url, data, options)
      .then((response) => handleResponse(response));
  };

  // 重写$put方法
  Vue.prototype.$put = function(url, data, options = {}) {
    return originalPut
      .call(this, url, data, options)
      .then((response) => handleResponse(response));
  };

  /**
   * 处理响应数据，解密Data字段
   * @param {Object} response - 接口响应对象
   * @returns {Object} - 处理后的响应对象
   */
  function handleResponse(response) {
    console.log(response);
    // 检查响应是否为对象
    if (response && typeof response === "object") {
      // 情况1: 响应直接是加密字符串
      if (typeof response === "string") {
        try {
          return aesDecrypt(response);
        } catch (error) {
          console.error("响应数据解密处理失败:", error);
          return response;
        }
      }

      // 情况2: 响应是包含Data字段的对象
      if (response.Data) {
        try {
          // 解密Data字段
          const decryptedData = aesDecrypt(response.Data);

          // 尝试解析为JSON
          try {
            response.Data = JSON.parse(decryptedData);
          } catch (e) {
            // 如果不是JSON格式，保留原始解密字符串
            response.Data = decryptedData;
          }

          // 返回修改后的响应对象
          return response;
        } catch (error) {
          console.error("响应数据解密处理失败:", error);
        }
      }

      // 情况3: 响应是axios风格的包装对象
      if (response.data && response.data.Data) {
        try {
          // 解密Data字段
          const decryptedData = aesDecrypt(response.data.Data);

          // 尝试解析为JSON
          try {
            response.data.Data = JSON.parse(decryptedData);
          } catch (e) {
            // 如果不是JSON格式，保留原始解密字符串
            response.data.Data = decryptedData;
          }

          // 返回修改后的响应对象
          return response;
        } catch (error) {
          console.error("响应数据解密处理失败:", error);
        }
      }
    }

    // 如果未处理，直接返回原始响应
    return response;
  }
}
